﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CrmContacto.Contracts.Contracts.Localization;
using System.Transactions;
using CrmContacto.Data;
using CrmContacto.Contracts.Services;

namespace CrmContacto.Services
{
    public class LocalizationService : ILocalization
    {
        public List<Lenguaje> ObtenerLenguajes()
        {
            using (CrmContactoEntities ctx = new CrmContactoEntities())
            {
                return ctx.DbLenguajes.Select(l => new
                Lenguaje
                {
                    Id = l.Id,
                    Nombre = l.Nombre
                }).ToList();
            }
        }

        public Lenguaje ObtenerLenguajeById(string Id)
        {
            using (CrmContactoEntities ctx = new CrmContactoEntities())
            {
                var dbLenguaje = ctx.DbLenguajes.Where(l => l.Id == Id).SingleOrDefault();

                Lenguaje lenguaje = new Lenguaje();
                lenguaje.Id = dbLenguaje.Id;
                lenguaje.Nombre = dbLenguaje.Nombre;

                // Cargo las listas
                foreach (var dbPalabraClave in ctx.DbPalabrasClaveAplicacions.OrderBy(p => p.Id))
                {
                    var dbLenguajeTraduccion = dbPalabraClave.PalabrasClaveAplicacionLenguajes.Where(l => l.LenguajeId == Id).SingleOrDefault();

                    PalabraClave palabraClave = new PalabraClave();
                    palabraClave.ClaveId = dbPalabraClave.Id;
                    palabraClave.LenguajeId = Id;                    
                    palabraClave.Nombre = dbPalabraClave.Nombre;
                    palabraClave.EsJavascript = dbPalabraClave.EsJavascript;
                    if (dbLenguajeTraduccion != null)
                    {
                        palabraClave.Traduccion = dbLenguajeTraduccion.Traduccion;
                    }

                    lenguaje.PalabraClaveList.Add(palabraClave);

                }                

                return lenguaje;
            }
        }

        public Lenguaje SaveLenguaje(Lenguaje lenguaje)
        {
            using (TransactionScope tScope = new TransactionScope())
            {
                using (CrmContactoEntities ctx = new CrmContactoEntities())
                {
                    DbLenguaje dbLenguaje = ctx.DbLenguajes.Where(l => l.Id == lenguaje.Id).SingleOrDefault();

                    if (dbLenguaje == null)
                    {
                        dbLenguaje = new DbLenguaje();
                        ctx.DbLenguajes.AddObject(dbLenguaje);
                        dbLenguaje.Id = lenguaje.Id;

                        // Creo todos los términos
                        foreach (var dbPalabraClave in ctx.DbPalabrasClaveAplicacions)
                        {
                            var traduccion = lenguaje.PalabraClaveList.Where(t => t.ClaveId == dbPalabraClave.Id).SingleOrDefault();
                            DbPalabrasClaveAplicacionLenguaje dbPCLenguaje = new DbPalabrasClaveAplicacionLenguaje();
                            dbPCLenguaje.ClaveId = dbPalabraClave.Id;
                            dbPCLenguaje.LenguajeId = lenguaje.Id;
                            if (traduccion != null)
                            {
                                dbPCLenguaje.Traduccion = traduccion.Traduccion;
                            }
                            else
                            {
                                dbPCLenguaje.Traduccion = string.Empty;
                            }

                            dbLenguaje.PalabrasClaveAplicacionLenguajes.Add(dbPCLenguaje);

                            PalabraClave palabraClave = new PalabraClave();
                            palabraClave.ClaveId = dbPalabraClave.Id;
                            palabraClave.LenguajeId = lenguaje.Id;
                            palabraClave.Nombre = dbPalabraClave.Nombre;
                            palabraClave.Traduccion = dbPCLenguaje.Traduccion;
                            palabraClave.EsJavascript = dbPalabraClave.EsJavascript;
                            lenguaje.PalabraClaveList.Add(palabraClave);
                        }
                    }
                    else
                    {
                        // Asigno los términos
                        foreach (var traduccion in lenguaje.PalabraClaveList)
                        {
                            var dbTraduccion = dbLenguaje.PalabrasClaveAplicacionLenguajes.Where(dbp => dbp.ClaveId == traduccion.ClaveId).SingleOrDefault();
                            if (dbTraduccion == null)
                            {
                                dbTraduccion = new DbPalabrasClaveAplicacionLenguaje();
                                dbTraduccion.ClaveId = traduccion.ClaveId;
                                dbLenguaje.PalabrasClaveAplicacionLenguajes.Add(dbTraduccion);
                                dbTraduccion.Traduccion = string.Empty;

                                //PalabraClave palabraClave = new PalabraClave();
                                //palabraClave.ClaveId = traduccion.ClaveId;
                                //palabraClave.LenguajeId = lenguaje.Id;
                                //palabraClave.Nombre = traduccion.Nombre;
                                //palabraClave.Traduccion = dbTraduccion.Traduccion;
                                //lenguaje.PalabraClaveList.Add(palabraClave);
                            }

                            if (dbTraduccion.Traduccion != traduccion.Traduccion)
                            {
                                dbTraduccion.Traduccion = traduccion.Traduccion;
                            }
                        }
                    }

                    dbLenguaje.Nombre = lenguaje.Nombre;

                    ctx.SaveChanges();
                    tScope.Complete();                    
                }
            }

            return lenguaje;
        }

        public void EliminarLenguaje(string id)
        {
            using (TransactionScope tScope = new TransactionScope())
            {
                using (CrmContactoEntities ctx = new CrmContactoEntities())
                {
                    DbLenguaje dbLenguaje = ctx.DbLenguajes.Where(l => l.Id == id).SingleOrDefault();

                    if (dbLenguaje != null)
                    {
                        var dbTraduccionList = dbLenguaje.PalabrasClaveAplicacionLenguajes.ToList();
                        foreach (var dbTraduccion in dbTraduccionList)
                        {
                            ctx.DbPalabrasClaveAplicacionLenguajes.DeleteObject(dbTraduccion);
                        }

                        ctx.DbLenguajes.DeleteObject(dbLenguaje);                        
                    }                    

                    ctx.SaveChanges();
                    tScope.Complete();
                }
            }
        }

        public PalabraClave GetPalabraClaveLenguaje(string LenguajeId, string ClaveId)
        {
            PalabraClave palabraClave = new PalabraClave();
            using (CrmContactoEntities ctx = new CrmContactoEntities())
            {
                var dbLenguajeTraduccion = ctx.DbPalabrasClaveAplicacionLenguajes.Where(p => p.ClaveId == ClaveId && p.LenguajeId == LenguajeId).SingleOrDefault();

                if (dbLenguajeTraduccion != null)
                {
                    palabraClave.ClaveId = dbLenguajeTraduccion.ClaveId;
                    palabraClave.LenguajeId = dbLenguajeTraduccion.LenguajeId;
                    palabraClave.Traduccion = dbLenguajeTraduccion.Traduccion;
                    palabraClave.Nombre = dbLenguajeTraduccion.PalabrasClaveAplicacion.Nombre;
                    palabraClave.EsJavascript = dbLenguajeTraduccion.PalabrasClaveAplicacion.EsJavascript;
                }
            }

            return palabraClave;
        }

        public PalabraClave SavePalabraClaveLenguaje(PalabraClave palabraClave)
        {
            using (TransactionScope tScope = new TransactionScope())
            {
                using (CrmContactoEntities ctx = new CrmContactoEntities())
                {
                    DbPalabrasClaveAplicacionLenguaje dbPCLenguaje = ctx.DbPalabrasClaveAplicacionLenguajes.Where(p => p.ClaveId == palabraClave.ClaveId && p.LenguajeId == palabraClave.LenguajeId).SingleOrDefault();
                    if (dbPCLenguaje != null)
                    {
                        dbPCLenguaje.Traduccion = palabraClave.Traduccion;

                        ctx.SaveChanges();
                        tScope.Complete();
                    }
                }
            }

            return palabraClave;
        }
    }
}
